Αυτό που ψάχνεις είναι ο μηχανισμός για validation σε Windows Forms (υποθέτω ότι αναφέρεσαι σε εφαρμογή Windows Forms).
Γενικά, κάθε φόρμα (και κάθε control) παρέχει δύο events το Validating και το Validated που χρησιμοποιούνται για ...validation. Το Validating event τρέχει αμέσως μόλις το εκάστοτε control αποκτήσει input αλλά πριν θεωρηθεί valid αυτό το input και είναι το event που συνήθως χρησιμοποιείται στο databinding. To Validated event τρέχει μόλις το input θεωρηθεί valid. Μόλις ένα control καταλάβει ότι ο χρήστης έχει τελειώσει και έχει δώσει input (δηλαδή όταν πάει να φύγει το focus επειδή ο χρήστης μεταφέρθηκε σε επόμενο control) τότε τρέχει το Validating event. Ο τύπος του event είναι CancelEventHandler που δέχεται ένα CancelEventArgs όρισμα. Αυτό το όρισμα περιέχει ένα property που ονομάζεται Cancel που αν μέσα στον event handler του δώσουμε τιμή true τότε το control καταλαβαίνει ότι το validation έχει αποτύχει. Έτσι, το focus δεν θα φύγει και ο χρήστης αναγκάζεται να διορθώσει το input πριν προxωρίσει στο επόμενο control. Παράδειγμα:
Private Sub textBox1_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles textBox1.Validating
Dim errorMsg As String
If Not ValidEmailAddress(textBox1.Text, errorMsg) Then
' Cancel the event and select the text to be corrected by the user.
e.Cancel = True
textBox1.Select(0, textBox1.Text.Length)
End If
End Sub
Βέβαια, πολλές φορές είναι εκνευριστικό να μην μπορείς να προχωρήσεις (και ιδιαίτερα να σου πετάγονται Message Boxes) και έτσι δεν χρησιμοποιείται ακριβώς αυτή η τεχνική αλλά η τεχνική του να παρέχεις στο χρήστη συνολικά πληροφορίες στο τέλος, πριν να πατήσει το OK button. Χρησιμοποιείται ένα ErrorProvider control το οποίο εμφανίζει ένα κόκκινο θαυμαστικό δίπλα στο control με την invalid τιμή. Ο χρήστης μπορεί να μετακινηθεί σε όποιο control θέλει αλλά τελικά θα πρέπει να τα διορθώσει όλα.
Private Sub textBox1_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles textBox1.Validating
Dim errorMsg As String
If Not ValidEmailAddress(textBox1.Text, errorMsg) Then
' Set the ErrorProvider error with the text to display.
Me.errorProvider1.SetError(textBox1, errorMsg)
End If
End Sub
Μια τέτοια τεχνική περίπου μπορείς να ακολουθήσεις κι εσύ. Επιπρόσθετα, μπορείς να έχεις μια boolean μεταβλητή πχ FieldsAreValid σε επίπεδο φόρμας που αν οποιοδήποτε control την θέσει σε false (κατά το Validating event του), τότε δεν αφήνεις να ολοκληρωθεί το navigation event. Στην περίπτωση του BindingNavigator αλλάζεις τα MoveFirstItem, MoveLastItem, MoveNextItem και MovePreviousΙtem σε (none). Κατόπιν, για κάθε ένα από τα buttons γράφεις τον κώδικα για να χειριστείς ο ίδιος το Navigation. Πχ.
Private Sub BindingNavigatorMoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles BindingNavigatorMoveNextItem.Click
If FieldsAreValid Then
BindingSource1.MoveNext()
Else
...
End If
End Sub
Αυτό είναι σε γενικές γραμμές το validation των Windows Forms. Δεν ξέρω κατά πόσο θα σε βοηθήσουν τα παραπάνω καθώς περιγράφεις πολύ γενικά το τι θέλεις να κάνεις. Θα πρέπει να είσαι πιο συγκεκριμένος στο τι θέλεις να κάνεις για να σου δώσουμε κι εμείς με τη σειρά μας πιο συγκεκριμένη απάντηση. Μπορείς να το ψάξεις παραπάνω στο MSDN, θα βρεις αρκετό υλικό για να το ψάξεις παραπάνω καθώς υπάρχουν κι άλλες τεχνικές όπως για παράδειγμα να παίξεις με το validation σε επίπεδο φόρμας.
Vir prudens non contra ventum mingit